package web.actions;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import modelo.carrera.Conductor;
import modelo.carrera.Jugador;
import modelo.comportamiento.Comportamiento;
import modelo.comportamiento.Conciencia;
import modelo.geometria.Vector;
import modelo.vehiculos.*;

import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;

import repositorioJuego.IRepositorioJuego;
import web.forms.InscripcionForm;


public class InscripcionAction  extends DispatchAction{
	
	/**Recupera una lista de vehiculo y los comportamientos del conductor*/
	public ActionForward iniciar(
		    ActionMapping mapping, 
		    ActionForm form, 
		    HttpServletRequest request, 
		    HttpServletResponse response) throws Exception{
		String usuario = (String) request.getSession().getAttribute("usuario");
		if (usuario == null){
			return mapping.findForward("login");
		}else{
			String idCarrera = (String)request.getParameter("idCarrera");
			request.getSession().setAttribute("idCarrera",idCarrera );
			return mapping.findForward("success");
		}
	}
	
	public ActionForward alta(
		    ActionMapping mapping, 
		    ActionForm form, 
		    HttpServletRequest request, 
		    HttpServletResponse response) throws Exception{
		
		ActionErrors errors;
		String idCarrera = (String)request.getSession().getAttribute("idCarrera");
		request.getSession().removeAttribute("idCarrera");
		
		String usuario = (String) request.getSession().getAttribute("usuario");
		if (usuario == null){
			return mapping.findForward("login");
		}else{
			InscripcionForm inscripcionForm = (InscripcionForm)form;
			errors = new ActionErrors();
			
			if (inscripcionForm.getTipoVehiculo() == null){
				ActionError error = new ActionError("error.inscripcion.falta.vehiculo");
		        errors.add("ErrorInscripcion", error);
		        saveErrors(request, errors);
				return mapping.findForward("success");
					
			}else if (inscripcionForm.getComportamiento() == null){
				ActionError error = new ActionError("error.inscripcion.falta.conductor");
		        errors.add("ErrorInscripcion", error);
		        saveErrors(request, errors);
				return mapping.findForward("success");
				
			}else{
				
				IRepositorioJuego repositorio = (IRepositorioJuego) servlet.getServletContext().getAttribute("IRepositorioJuego");
				double velocidadMax = (Double)servlet.getServletContext().getAttribute("VelocidadMaxima");

				// crear Jugador
				Jugador jugador = crearJugador(inscripcionForm.getTipoVehiculo(),velocidadMax, usuario);
				repositorio.addJugador(jugador, idCarrera);	
				
				repositorio.addJugador(jugador, idCarrera);
/* y esto que onda?
				Vector posicionVehiculoFinal = new Vector(3,3);
			
				if(inscripcionForm.getTipoVehiculo().equals("vehiculo")){
					SentidoVehiculo sentidoVehiculo = SentidoVehiculo.NORTE;
					double ancho = 2;
					double largo = 2;
					double velocidadActual = 0;
					double velocidadMaxima = velocidadMax;
					double aceleracionMaxima = 5;
					double frenadoMaximo = 50;
					vehiculo = new Automovil(conductor,posicionVehiculoInicial, posicionVehiculoFinal, sentidoVehiculo, largo, ancho, velocidadActual, velocidadMaxima,
							aceleracionMaxima, frenadoMaximo);
				}else{
					SentidoVehiculo sentidoVehiculo = SentidoVehiculo.NORTE;
					double ancho = 2;
					double largo = 3;
					double velocidadActual = 0;
					double velocidadMaxima = velocidadMax;
					double aceleracionMaxima = 10;
					double frenadoMaximo = 50;					
					vehiculo = new Ambulancia(conductor,posicionVehiculoInicial, posicionVehiculoFinal, sentidoVehiculo, largo, ancho, velocidadActual, velocidadMaxima,
							aceleracionMaxima, frenadoMaximo);
				}
				Jugador jugador = new Jugador(usuario,vehiculo);
	
				repositorio.addJugador(jugador, idCarrera);
	*/
			velocidadMax += 5;
				request.getSession().removeAttribute("VelocidadMaxima");
				servlet.getServletContext().setAttribute("VelocidadMaxima", velocidadMax);
				errors = new ActionErrors();
				errors.add("InscripcionOk",new ActionError("inscripcion.ok"));
				saveErrors(request, errors);
				return mapping.findForward("home");			
				}
			}
	}
	
	protected Jugador crearJugador(String tipoVehiculo, double velMax, String usuario) {
		Vehiculo vehiculo;
		Comportamiento comportamiento = new Comportamiento(new Conciencia());
		Conductor conductor = new Conductor(comportamiento);
		Vector posicionVehiculoInicial = new Vector(3,3);
		Vector posicionVehiculoFinal = new Vector(3,3);
		
		if(tipoVehiculo.equals("automovil")){
			SentidoVehiculo sentidoVehiculo = SentidoVehiculo.NORTE;
			double ancho = 2;
			double largo = 2;
			double velocidadActual = 0;
			double velocidadMaxima = velMax;
			double aceleracionMaxima = 5;
			double frenadoMaximo = 50;
			vehiculo = new Automovil(conductor,posicionVehiculoInicial, posicionVehiculoFinal, sentidoVehiculo, largo, ancho, velocidadActual, velocidadMaxima,
					aceleracionMaxima, frenadoMaximo);
		}else{
			SentidoVehiculo sentidoVehiculo = SentidoVehiculo.NORTE;
			double ancho = 2;
			double largo = 3;
			double velocidadActual = 0;
			double velocidadMaxima = velMax;
			double aceleracionMaxima = 10;
			double frenadoMaximo = 50;					
			vehiculo = new Ambulancia(conductor,posicionVehiculoInicial, posicionVehiculoFinal , sentidoVehiculo, largo, ancho, velocidadActual, velocidadMaxima,
					aceleracionMaxima, frenadoMaximo);
		}
		Jugador jugador = new Jugador(usuario,vehiculo);
		return jugador;		
	}
}
